package core.reports;

/**
 * This defines an interface that every builder must implement
 * so that the directors have access to all of the same functions.
 */

public interface IBuilder 
{
	//public boolean createFile(String filename);
	
	//public boolean closeFile();
	
	/**
	 * This method will add a title to the product that 
	 * we are producing.  The String that is passed in
	 * will be printed bigger and darker than other text.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 * 
	 * @param title The String containing the title to 
	 * 		place on the document.
	 */
	public void addTitle(String title);
	
	/**
	 * Add a paragraph of text to the product. This will be
	 * printed in paragraph form. The text will be normal
	 * font, normal size, and normal weight.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 * 
	 * @param text A String that contains the text of the
	 * 		paragraph.
	 */
	public void addParagraph(String text);
	
	/**
	 * This will create a table with a set number of
	 * columns in it. When this method gets done the
	 * table will be "open" and an error will occur
	 * in the document if a corresponding call to
	 * 'closeCurrentTable()' is not made.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 * 
	 * @param numCols The number of columns that are
	 * 		in the table.
	 */
	public void addTable(int numCols);
	
	/*
	 * Add a row to the currently "open" table. After
	 * this method runs a row will be "open" and if
	 * there is not a corresponding call to 'closeRow()'
	 * then an error will occur in the product that
	 * is being built.
	 */
	//public void addRow();
	
	/**
	 * This will add a cell that the text is bold and
	 * slightly bigger. See {@link #addCell(String)} for
	 * more details.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 * 
	 * @param header The text that will be displayed in
	 * 		the header cell.
	 */
	public void addColumnHeader(String header);
	
	/**
	 * Add a cell to the currently "open" table. Adding 
	 * cells will automatically fill a row(depending on 
	 * number of columns defined in the call to addTable)
	 * and then continue onto a next row.
	 * 
	 * If 'closeCurrentTable()' is called before a row is
	 * completely filled up then the 'closeCurrentTable()'
	 * method will automatically fill up the rest of the
	 * row with empty cells.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 * 
	 * @param data The data the will be printed in the 
	 * 		cell.  The data will be printed with normal
	 * 		font, and normal weight.
	 */
	public void addCell(String data);
	
	//public void closeRow();
	
	/**
	 * This will close the currently "open" table. If 
	 * the table is not at the end of a row, then this
	 * method will fill up the remaining row with 
	 * empty cells, then close the table.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 */
	public void closeCurrentTable();
	
	/**
	 * This will "open" a list structure in the 
	 * document that is currently being built. Without
	 * a corresponding call to  'closeCurrentList()' 
	 * the document will contain an error in it.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 */
	public void addList();
	
	/**
	 *  This method will add an item to the currently 
	 *  "open" list structure.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 *  
	 * @param item The text to be displayed beside the
	 * 		list point.
	 */
	public void addListItem(String item);
	
	/**
	 * This method will close the currently "open"
	 * list structure.
	 * 
	 * If a call to the method 'finish()' has been made
	 * then subsequent calls to this method will do nothing.
	 * for more information see {@link #finish()} for more
	 * information.
	 */
	public void closeCurrentList();
	
	/**
	 * This finishes off the building of this product.
	 * The product is closed and is no longer available
	 * for editing.  After a call to this method all other 
	 * methods that are called should do nothing.
	 */
	public void finish();
	
	/**
	 * This method will add a blank line to the currently open document.
	 */
	public void addBlankLine();
	
	/**
	 * This method will add a subtitle to the currently
	 * opened document.  This will be smaller than the
	 * original title and left aligned.
	 */
	public void addSubTitle(String subTitle);
}
